package com.minimalist.common.utils;

import cn.hutool.core.util.IdUtil;
import org.slf4j.MDC;

import java.util.function.Supplier;

/**
 * TraceId 工具类
 * 用于在异步任务和定时任务中设置 traceId
 *
 * @author minimalist
 */
public class TraceIdUtil{

    /**
     * 生成 traceId
     *
     * @return traceId
     */
    public static String generateTraceId(){
        return IdUtil.randomUUID();
    }

    /**
     * 在当前线程中设置 traceId 并执行任务
     *
     * @param task 任务
     * @param <T>  返回值类型
     * @return 任务执行结果
     */
    public static <T> T runWithTraceId(Supplier<T> task){
        String traceId = generateTraceId();
        try{
            MDC.put(CommonConstant.TRACE_ID, traceId);
            return task.get();
        } finally{
            MDC.clear();
        }
    }

    /**
     * 在当前线程中设置 traceId 并执行任务（无返回值）
     *
     * @param task 任务
     */
    public static void runWithTraceId(Runnable task){
        String traceId = generateTraceId();
        try{
            MDC.put(CommonConstant.TRACE_ID, traceId);
            task.run();
        } finally{
            MDC.clear();
        }
    }
}